/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * See LICENSE.txt included in this distribution for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at LICENSE.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
 */
package org.opengrok.web.api.v1.suggester.query;

import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.Query;
import org.opengrok.suggest.query.SuggesterQuery;
import org.opengrok.indexer.search.CustomQueryParser;
import org.opengrok.indexer.search.QueryBuilder;

/**
 * Used for preserving the OpenGrok query building properties with special handling for the suggestions field which
 * uses {@link SuggesterQueryParser} instead of OpenGrok's {@link CustomQueryParser}.
 */
public class SuggesterQueryBuilder extends QueryBuilder {

    private final String suggestField;
    private final String identifier;

    private SuggesterQueryParser suggesterQueryParser;

    /**
     * @param suggestField field that contain the {@link SuggesterQuery}
     * @param identifier identifier that was inserted into the query to detect the {@link SuggesterQuery}
     */
    public SuggesterQueryBuilder(final String suggestField, final String identifier) {
        this.suggestField = suggestField;
        this.identifier = identifier;
    }

    public SuggesterQuery getSuggesterQuery() {
        return suggesterQueryParser.getSuggesterQuery();
    }

    public String getIdentifier() {
        return suggesterQueryParser.getIdentifier();
    }

    public String getQueryTextWithPlaceholder() {
        return suggesterQueryParser.getQueryTextWithPlaceholder();
    }

    /** {@inheritDoc} */
    @Override
    protected Query buildQuery(final String field, final String queryText)
            throws ParseException {

        if (field.equals(suggestField)) {
            suggesterQueryParser = new SuggesterQueryParser(field, identifier);
            return suggesterQueryParser.parse(queryText);
        } else {
            return new CustomQueryParser(field).parse(queryText);
        }
    }

}
